package asem.ast.expresiones;

import genc.GenC;
import alex.Token;
import asem.TablaSimbolos;
import asem.ast.sentencias.NodoBloque;
import asem.excepciones.ExcepcionAccesoInvalido;
import asem.tablaSimbolos.Constructor;
import asem.tablaSimbolos.Metodo;
import asem.tablaSimbolos.tipo.TipoClase;
import asem.tablaSimbolos.tipo.TipoMetodo;

public class NodoThis extends NodoOperando {
	protected Token tokenThis;

	public NodoThis(Token t) {
		// El tipo del this es el tipo de la clase que estamos procesando
		tokenThis = t;
		tipo = new TipoClase(TablaSimbolos.tabla.claseActual()
				.getIdentificador());
	}

	@Override
	public TipoMetodo chequeoSentencias(NodoBloque contenedor) {

		Constructor m = TablaSimbolos.tabla.metodoActual();
		
		if ((m instanceof Metodo) && m.esEstatico())
			throw new ExcepcionAccesoInvalido(tokenThis, (Metodo) m, "this");
		else
			GenC.gen.loadThis();
		
		return tipo;
	}
}
